package main

import (
	"database/sql"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"

	_ "github.com/go-sql-driver/mysql"
)

/**
 *少量数据可以，量太大，循环select，循环insert容易卡数据库
 */
func main() {
	// 数据库配置
	dbUser := "root"
	dbPass := "Njty008njty!"
	dbName := "netrides"
	dbHost := "117.88.244.227"
	dbPort := "13049"

	// 连接 MySQL 数据库
	db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", dbUser, dbPass, dbHost, dbPort, dbName))
	if err != nil {
		log.Fatalf("无法连接数据库: %v", err)
	}
	defer db.Close()

	// 检查数据库连接
	err = db.Ping()
	if err != nil {
		log.Fatalf("数据库连接失败: %v", err)
	}

	fmt.Println("成功连接到数据库")

	// 定义命令行参数
	inputDir := flag.String("input", "input", "输入的文件夹路径")
	flag.Parse()

	// 确保输入目录存在
	if _, err := os.Stat(*inputDir); os.IsNotExist(err) {
		log.Fatalf("输入目录不存在: %v", err)
	}

	// 遍历输入目录中的所有文件和子目录
	err = filepath.Walk(*inputDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if info.IsDir() {
			return nil
		}

		// 检查文件扩展名是否为 .txt
		ext := strings.ToLower(filepath.Ext(path))
		if ext != ".txt" {
			return nil
		}

		// 获取文件名（mobile_number）
		fileName := strings.TrimSuffix(filepath.Base(path), ext)

		// 读取文件内容
		fileData, err := ioutil.ReadFile(path)
		if err != nil {
			log.Printf("无法读取文件 %s: %v", path, err)
			return nil
		}

		// 通过 mobile_number 查找 driver 表中的 id
		var driverID int
		var idNum string
		err = db.QueryRow("SELECT d.id,i.identity_number FROM driver d join driver_extra_information i on d.id = i.driver_id WHERE mobile_number = ?", fileName).Scan(&driverID, &idNum)
		if err != nil {
			if err == sql.ErrNoRows {
				log.Printf("未找到 mobile_number 为 %s 的记录: %v", fileName, err)
				return nil
			}
			log.Printf("查询数据库时出错: %v", err)
			return nil
		}

		// 将文件内容插入到 private_call_apply_record 表
		_, err = db.Exec("INSERT INTO private_call_apply_record (driver_id, phone_number, id_number, scene_photo, state, operator) VALUES (?, ?, ?, ?, ?, ?)", driverID, fileName, idNum, "data:image/jpeg;base64,"+string(fileData), 0, "goer")

		if err != nil {
			log.Printf("无法插入数据到数据库: %v", err)
			return nil
		}

		fmt.Printf("文件 %s 已处理并插入到数据库\n", path)

		return nil
	})

	if err != nil {
		log.Fatalf("遍历文件夹时出错: %v", err)
	}

	fmt.Println("文件处理完成")
}
